#!/bin/bash
# 该脚本用于实现在 Linux 中对主机名 hostname 进行重命名

# 临时保存并修改语言环境
LANG_temp=$LANG
LANG=zh_CN.UTF-8

# 还原语言环境
function re_lang () {
    # 将语言环境修改回原来的值
    LANG=$LANG_temp
}

# 还原语言环境，并无异常退出
function re_lang_exit () {
    re_lang
    exit 0
}

function success_text () {
    echo -e -n "\033[32m【SUCCESS】\033[0m"
}

function warn_text () {
    echo -e -n "\033[33m【WARN】\033[0m"
}

function error_text () {
    echo -e -n "\033[31m【ERROR】\033[0m"
}

# 需要进行修改的文件
hostname_file=/etc/hostname
hosts_file=/etc/hosts

# 如果当前用户对 /etc/hostname 文件没有读写的权限，退出脚本的执行
if [[ ! -r $hostname_file || ! -w $hostname_file ]]
then
    error_text
    echo "对 $hostname_file 文件没有读写权限，无法进行主机名的修改"
    re_lang_exit
fi

# 如果当前用户对 /etc/hosts 文件没有读写的权限，退出脚本的执行
if [[ ! -r $hosts_file || ! -w $hosts_file ]]
then
    error_text
    echo "对 $hosts_file 文件没有读写权限，无法进行主机名的修改"
    re_lang_exit
fi

# 提示
warn_text
echo "提示："
echo "1.新主机名中的空格字符会被替换为 -"
echo "2.新主机名请不要使用 Linux 操作系统中已有特殊含义的字符(避免未来发生冲突而报错)"

# 获取并输出旧主机名
old_hostname=`hostname`
echo "旧主机名为："$old_hostname

# 输入新主机名
while true; do
    read -p "请输入新主机名：" new_hostname
    if [ -z "$new_hostname" ]; then
        error_text
	echo "输入的新主机名为空，请重新输入."
    else
	    break
    fi
done
echo "输入的新主机名为：$new_hostname"

# 修改 /etc/hostname 文件
echo "修改 $hostname_file 文件..."
echo "$new_hostname" > $hostname_file || re_lang_exit
sed -i 's/[[:space:]][[:space:]]*/-/g' $hostname_file || re_lang_exit # 替换空格为 -
success_text
echo "$hostname_file 文件修改成功"
echo "$hostname_file 文件当前的内容为："
cat $hostname_file
new_hostname=`cat $hostname_file`

# 修改 /etc/hosts 文件
echo "修改 $hosts_file 文件..."
sed -i "s/$old_hostname/$new_hostname/g" $hosts_file || re_lang_exit # -i 直接修改原文件，不生成新文件
success_text
echo "$hosts_file 文件修改成功"
echo "$hosts_file 文件当前的内容为："
cat $hosts_file

warn_text
echo "可以执行 reboot now 命令立即重启系统，让修改的主机名生效."

# 还原语言环境
re_lang
